#include<stdio.h>
#include<malloc.h>
#define MaxSise 100
typedef struct
{
    char data[MaxSise];
    int length;
}SqString;
void StrAssign(SqString &s,char cstr[])
{
    for(int i=0;cstr[i]!='\0';i++)
        s.data[i]=cstr[i];
    s.length=i;
}
void DestroyStr(SqString &s)
{ }
void StrCopy(SqString &s,SqString t)
{
    for(int i=0;i<t.length;i++)
        s.data[i]=t.data[i];
    s.length=t.length;
}
bool StrEqual(SqString s,SqString t)
{
    bool same=true;
    if(s.length!=t.length)
        same=false;
    else
        for(int i=0;i<s.length;i++)
            if(s.data[i]!=t.data[i])
            {
                same=false;
                break;
            }
    return same;
}
int StrLength(SqString s)
{
    return s.length;
}
SqString Concat(SqString s,SqString t)
{
    SqString str;
    int i;
    str.length=s.length+t.length;
    for(i=0;i<s.length;i++)
        str.data[i]=s.data[i];
    for(i=0;i<t.length;i++)
        str.data[s.length+i]=t.data[i];
    return str;
}
SqString SubStr(SqString s,int i,int j)
{
    SqString str;
    int k;
    str.length=0;
    if(i<=0||i>s.length||j<0||i+j-1>s.length)
        return str;
    for(k=i-1;k<i+j-1;k++)
        str.data[k-i+1]=s.data[k];
    str.length=j;
    return str;
}
SqString InsStr(SqString s1,int i,SqString s2)
{
    int j;SqString str;
    str.length=0;
    if(i<=0||i>s1.length+1)
        return str;
    for(j=0;j<i-1;j++)
        str.data[j]=s1.data[j];
    for(j=0;j<s2.length;j++)
        str.data[i+j-1]=s2.data[j];
    for(j=i-1;j<s1.length;j++)
        str.data[s2.length+j]=s1.data[j];
    str.length=s1.length+s2.length;
    return str;
}
SqString DelStr(SqString s,int i,int j)
{
    int k;SqString str;
    str.length=0;
    if(i<=0||i>s.length||i+j>s.length+1)
        return str;
    for(k=0;k<i-1;k++)
        str.data[k]=s.data[k];
    for(k=i+j-1;k<s.length;k++)
        str.data[k-1]=s.data[k];
    str.length=s.length-j;
    return str;
}
SqString Repstr(SqString s,int i,int j,SqString t)
{
    int k;SqString str;
    str.length=0;
    if(i<=0||i>s.length||i+j-1>s.length)
        return str;
    for(k=0;k<i-1;k++)
        str.data[k]=s.data[k];
    for(k=0;k<t.length;k++)
        str.data[i+k-1]=t.data[k];
    for(k=i+j-1;k<s.length;k++)
        str.data[t.length+k-1]=s.data[k];
    str.length=s.length-j+t.length;
    return str;
}
void DispStr(SqString s)
{
    if(s.length>0)
    {
        for(int i=0;i<s.length;i++)
        printf("%c",s.data[i]);
    printf("\n");
    }
}
SqString *Maxsubstr(SqString s)
{
    SqString *subs;
    int index=0,length=0,i=0,length1,j,k;
    while(i<s.length)
    {
        j=i+1;
        while(j<s.length)
        {
            if(s.data[i]==s.data[j])
            {
                length1=0;
                for(k=1;s.data[i+k]=s.data[j+k];k++)
                    length1++;
                if(length1>length)
                {
                    index=i;
                    length=length1;
                }
                j+=length1;
            }
            else j++;
        }
        i++;
    }
    subs=(SqString *)malloc(sizeof(SqString));
    sub->length=length;
    for(i=0;i<length;i++)
        subs->data[i]=s.data[index+i];
    return subs;
}
int main()
{
    char str[MaxSise];
    SqString s,*subs;
    printf("输入串:");
    gets(str);
    StrAssign(s,str);
    subs=Maxsubstr(s);
    printf("求最长重复子串:");
    printf("原串:");
    DispStr(s);
    printf("最长重复子串:");
    DispStr(*str);
    DestroyStr(s);free(subs);
    return 1;
}